ret = ioports_permit_access(d, fp, fp + np - 1);
else
ret = ioports_deny_access(d, fp, fp + np - 1);
- if ( !ret )
- memory_type_changed(d);
break;
}
"ioport_map: error %ld denying dom%d access to [%x,%x]\n",
ret, d->domain_id, fmp, fmp + np - 1);
}
- if ( !ret )
- memory_type_changed(d);
break;
}
#ifndef __X86_IOCAP_H__
#define __X86_IOCAP_H__
-#define ioports_permit_access(d, s, e) \
- rangeset_add_range((d)->arch.ioport_caps, s, e)
-#define ioports_deny_access(d, s, e) \
- rangeset_remove_range((d)->arch.ioport_caps, s, e)
+#include <xen/sched.h>
+#include <xen/rangeset.h>
+
+#include <asm/p2m.h>
+
#define ioports_access_permitted(d, s, e) \
rangeset_contains_range((d)->arch.ioport_caps, s, e)
(!rangeset_is_empty((d)->iomem_caps) || \
!rangeset_is_empty((d)->arch.ioport_caps))
+static inline int ioports_permit_access(struct domain *d, unsigned long s,
+ unsigned long e)
+{
+ bool flush = cache_flush_permitted(d);
+ int ret = rangeset_add_range(d->arch.ioport_caps, s, e);
+
+ if ( !ret && !is_iommu_enabled(d) && !flush )
+ /* See comment in iomem_permit_access(). */
+ memory_type_changed(d);
+
+ return ret;
+}
+
+static inline int ioports_deny_access(struct domain *d, unsigned long s,
+ unsigned long e)
+{
+ int ret = rangeset_remove_range(d->arch.ioport_caps, s, e);
+
+ if ( !ret && !is_iommu_enabled(d) && !cache_flush_permitted(d) )
+ /* See comment in iomem_deny_access(). */
+ memory_type_changed(d);
+
+ return ret;
+}
+
#endif /* __X86_IOCAP_H__ */
return MTRR_TYPE_UNCACHABLE;
}
+ /*
+ * Conditional must be kept in sync with the code in
+ * {iomem,ioports}_{permit,deny}_access().
+ */
if ( type != p2m_mmio_direct && !is_iommu_enabled(d) &&
!cache_flush_permitted(d) )
{
ret = iomem_permit_access(d, mfn, mfn + nr_mfns - 1);
else
ret = iomem_deny_access(d, mfn, mfn + nr_mfns - 1);
- if ( !ret )
- memory_type_changed(d);
break;
}
"memory_map: error %ld removing dom%d access to [%lx,%lx]\n",
ret, d->domain_id, mfn, mfn_end);
}
- /* Do this unconditionally to cover errors on above failure paths. */
- memory_type_changed(d);
break;
}
#ifndef __XEN_IOCAP_H__
#define __XEN_IOCAP_H__
+#include <xen/sched.h>
#include <xen/rangeset.h>
#include <asm/iocap.h>
+#include <asm/p2m.h>
+
+static inline int iomem_permit_access(struct domain *d, unsigned long s,
+ unsigned long e)
+{
+ bool flush = cache_flush_permitted(d);
+ int ret = rangeset_add_range(d->iomem_caps, s, e);
+
+ if ( !ret && !is_iommu_enabled(d) && !flush )
+ /*
+ * Only flush if the range(s) are empty before this addition and
+ * IOMMU is not enabled for the domain, otherwise it makes no
+ * difference for effective cache attribute calculation purposes.
+ */
+ memory_type_changed(d);
+
+ return ret;
+}
+
+static inline int iomem_deny_access(struct domain *d, unsigned long s,
+ unsigned long e)
+{
+ int ret = rangeset_remove_range(d->iomem_caps, s, e);
+
+ if ( !ret && !is_iommu_enabled(d) && !cache_flush_permitted(d) )
+ /*
+ * Only flush if the range(s) are empty after this removal and
+ * IOMMU is not enabled for the domain, otherwise it makes no
+ * difference for effective cache attribute calculation purposes.
+ */
+ memory_type_changed(d);
+
+ return ret;
+}
-#define iomem_permit_access(d, s, e) \
- rangeset_add_range((d)->iomem_caps, s, e)
-#define iomem_deny_access(d, s, e) \
- rangeset_remove_range((d)->iomem_caps, s, e)
#define iomem_access_permitted(d, s, e) \
rangeset_contains_range((d)->iomem_caps, s, e)